package com.youmeek.ssm.module.area.service.impl;

import com.youmeek.ssm.module.area.mapper.ChinaAreaMapper;
import com.youmeek.ssm.module.area.model.ChinaArea;
import com.youmeek.ssm.module.area.service.IChinaAreaService;
import com.youmeek.ssm.module.common.model.TreeNode;
import com.youmeek.ssm.utils.NodeUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;

@Service
public class ChinaAreaServiceImpl implements IChinaAreaService {
    @Resource
    private ChinaAreaMapper chinaAreaMapper;

    /**
     * 获取国家的根节点
     *
     * @return
     */
    private ChinaArea getTopChinaArea() {
        return ChinaArea.topChinaArea();
    }

    @Override
    public TreeNode<ChinaArea> getTopNode() {
        ChinaArea topChinaArea = getTopChinaArea();
        List<ChinaArea> allChinaArea = getAllChinaArea();
        TreeNode<ChinaArea> topNode = NodeUtils.buildNode(new TreeNode<ChinaArea>(topChinaArea), allChinaArea, new ChinaAreaNodeHierachyImpl());
        return topNode;
    }

    @Override
    public TreeNode<ChinaArea> getTopNodeFirstLevel() {
        TreeNode<ChinaArea> treeNode = new TreeNode<>();
        treeNode.setValue(ChinaArea.topChinaArea());
        List<ChinaArea> chinaAreaList = getChildsByAreaCode("0");
        TreeSet<TreeNode<ChinaArea>> treeNodes = new TreeSet<>();

        return null;
    }

    @Override
    public List<ChinaArea> getChildsByAreaCode(String areaCode) {
        // 其实有个很讨巧的办法就是使用SQL的like语句。这里使用代码实现。

        List<ChinaArea> result = new ArrayList<>();
        TreeNode<ChinaArea> topNode = getTopNode();
        TreeNode<ChinaArea> specialNode = getSpecialNode(areaCode, topNode);
        if (specialNode != null) {
            Collection<TreeNode<ChinaArea>> nodes = specialNode.getNodes();
            for (TreeNode<ChinaArea> node : nodes) {
                result.add(node.getValue());
            }
        }
        return result;
    }

    private TreeNode<ChinaArea> getSpecialNode(String areaCode, TreeNode<ChinaArea> topNode) {
        ChinaArea chinaArea = topNode.getValue();
        Integer pAreaCode = chinaArea.getAreaCode();
        if (pAreaCode.equals(areaCode)) {
            return topNode;
        } else {
            // 判断是对应节点下面的子节点，根节点比较特殊
            if(pAreaCode.equals(0)|| areaCode.toString().startsWith(pAreaCode.toString())){
                TreeNode<ChinaArea> nodeFromChilds = getNodeFromChilds(areaCode, topNode);
                return  nodeFromChilds;
            }else{
                return null;
            }
        }
    }

    private TreeNode<ChinaArea> getNodeFromChilds(String areaCode,TreeNode<ChinaArea> topNode){
        Collection<TreeNode<ChinaArea>> childNodes = topNode.getNodes();
        if(childNodes.isEmpty()){
            return null;
        }
        // 遍历下面的子节点
        for(TreeNode<ChinaArea> treeNode : childNodes){
            TreeNode<ChinaArea> specialNode = getSpecialNode(areaCode, treeNode);
            if (specialNode == null) {
                continue;
            } else {
                return specialNode;
            }
        }
        return null;
    }

    @Override
    public List<ChinaArea> getAllChinaArea() {
        return chinaAreaMapper.selectAll();
    }

    @Override
    public ChinaArea getChinaAreaByCode(String code) {
        return chinaAreaMapper.selectByPrimaryKey(Integer.valueOf(code));
    }

    @Override
    public ChinaArea getChinaAreaByName(String name) {
        ChinaArea chinaArea = chinaAreaMapper.selectByname(name);
        return chinaArea;
    }

    @Override
    public ChinaArea getChinaAreaByNameAndParentId(String name, String parentId) {
        ChinaArea chinaArea = new ChinaArea();
        chinaArea.setAreaName(name);
        chinaArea.setParentId(Integer.valueOf(parentId));
        return chinaAreaMapper.selectNameAndParentId(chinaArea);
    }

    @Override
    public ChinaArea getChinaAreaByNameAndRegionCode(String name, String regionCoding) {
        List<ChinaArea> chinaAreas = chinaAreaMapper.selectFormName(name);
        if (chinaAreas != null) {
            for (ChinaArea chinaArea : chinaAreas) {
                Integer areaCode = chinaArea.getAreaCode();
                String codeStr = areaCode.toString();
                if (codeStr.startsWith(regionCoding)) {
                    return chinaArea;
                }

            }
        }
        return null;
    }

    @Override
    public ChinaArea getChinaAreaByShortName(String name) {
        ChinaArea chinaArea = chinaAreaMapper.selectShortName(name);
        return chinaArea;
    }

}
